//处理urlencoded字符串格式问题
function queryStringify(obj) {
  let str = "";
  for (let k in obj) str += `${k}=${obj[k]}&`;
  return str.slice(0, -1);
}

// 封装 ajax
function ajax(options) {
  //默认配置
  let defaultoptions = {
    //地址
    url: "",
    //请求方式
    method: "GET",
    //是否异步
    async: true,
    //请求携带的信息
    data: {},
    //请求头
    headers: {
      //配置应用凭证信息
      "X-LC-Id": "Jh3jhv7uVshfSOIxcakjuihb-gzGzoHsz",
      "X-LC-Key": "xT7icIBoS5kJrxTRmodCfxdk",
    },
    //请求成功的回调
    success: function () {},
    //请求失败的回调
    error: function () {},
  };
  //从你传进来的options配置对象中，解构赋值
  let { url, method, async, data, headers, success, error } = {
    ...defaultoptions,
    ...options,
  };

  if (
    typeof data === "object" &&
    //?.先判断？前的变量是否存在，存在则执行后续操作，不存在则不执行
    //请求头是否设置了Content-type 如果设置了再判断是否有json
    headers["Content-type"]?.indexOf("json") > -1
  ) {
    //如果请求的信息为对象且请求头设置了链接类型 表明是post请求而且是json字符串的数据发送
    data = JSON.stringify(data);
  } else {
    //否则用urlencoded 查询字符串格式
    data = queryStringify(data);
  }
  // 如果是 get 请求, 并且有参数, 那么直接组装一下 url 信息
  if (/^get$/i.test(method) && data) url += "?" + data;

  // 4. 发送请求
  const xhr = new XMLHttpRequest();
  xhr.open(method, url, async);
  xhr.onload = function () {
    if (!/^2\d{2}$/.test(xhr.status)) {
      error(`错误状态码:${xhr.status}`);
      return;
    }
    // 执行解析
    try {
      let result = JSON.parse(xhr.responseText);
      success(result);
    } catch (err) {
      error("解析失败 ! 因为后端返回的结果不是 json 格式字符串");
    }
  };

  // 设置请求头内的信息
  for (let k in headers) xhr.setRequestHeader(k, headers[k]);
  if (/^get$/i.test(method)) {
    xhr.send();
  } else {
    xhr.send(data);
  }
}
//在原有的基础上 用Promise封装一下
// function Pajax(options) {
//   const p = new Promise(function (resolve, reject) {
//     ajax({
//       ...options,
//       success: function (res) {
//         resolve(res);
//       },
//       error: function (err) {
//         reject(err);
//       },
//     });
//   });

//   return p;
// }
//es6
export function Pajax(options) {
  return new Promise((resolve, reject) => {
    ajax({
      ...options,
      success(res) {
        resolve(res);
      },
      error(err) {
        reject(err);
      },
    });
  });
}
/* 
  Pajax().then().catch
  
  */
